
package com.bgybmi.config;

import org.apache.log4j.Logger;

//import com.bgybmi.controller.QyJssdkController;
import com.bgybmi.controller.QyOAuthController;
import com.bgybmi.controller.QyWeixinApiController;
import com.bgybmi.controller.QyWeixinMsgController;
import com.bgybmi.controller.home.HomeIndexController;
import com.bgybmi.controller.meet.MeetController;
import com.bgybmi.controller.repair.BxController;
import com.bgybmi.entity.BxCreate;
import com.bgybmi.entity.BxDevice;
import com.bgybmi.entity.BxImgCreate;
import com.bgybmi.entity.CoMeetOrder;
import com.bgybmi.entity.JbDevice;
import com.bgybmi.entity.JbPhone;
import com.bgybmi.entity.JbRoom;
import com.bgybmi.entity.MeetCreate;
import com.bgybmi.entity.Users;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.ext.handler.ContextPathHandler;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.tx.TxByMethodRegex;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.druid.DruidStatViewHandler;
import com.jfinal.qyweixin.demo.QyJssdkController;
import com.jfinal.qyweixin.sdk.api.ApiConfig;
import com.jfinal.qyweixin.sdk.api.ApiConfigKit;
import com.jfinal.render.ViewType;
import com.jfinal.template.Engine;


/**
 * API引导式配置
 */
public class WeChatConfig extends JFinalConfig
{
    private static Logger logger = Logger.getLogger(WeChatConfig.class);
    
	/**
	 * 如果生产环境配置文件存在，则优先加载该配置，否则加载开发环境配置文件
	 * @param pro 生产环境配置文件
	 * @param dev 开发环境配置文件
	 */
	public void loadProp(String pro, String dev) {
		try {
			PropKit.use(pro);
		}
		catch (Exception e) {
			PropKit.use(dev);
		}
	}
	
	
	
	public ApiConfig getApiConfig() {
		ApiConfig ac = new ApiConfig();
		
		//Enum
		//传值		
		// 配置微信 API 相关常量
		ac.setToken(PropKit.get("token"));
		ac.setCorpId(PropKit.get("corpId"));
		
		//原本的
		ac.setCorpSecret(PropKit.get("secret"));//默认值
		ac.setAgentId(PropKit.get("agentId"));
		//		
		
		/**
		 *  是否对消息进行加密，对应于微信平台的消息加解密方式：
		 *  1：true进行加密且必须配置 encodingAesKey
		 *  2：false采用明文模式，同时也支持混合模式
		 *  
		 *  目前企业号只支持加密且必须配置
		 */
		ac.setEncryptMessage(PropKit.getBoolean("encryptMessage", true));
		ac.setEncodingAesKey(PropKit.get("encodingAesKey", "setting it in config file"));
		return ac;
	}
	
	public ApiConfig getApiConfigEnum(String type) {
		ApiConfig ac = new ApiConfig();		
		//Enum
		//传值		
		// 配置微信 API 相关常量
		ac.setToken(PropKit.get("token"));
		ac.setCorpId(PropKit.get("corpId"));		
		switch (type) {
		case "HY":
			ac.setCorpSecret(PropKit.get(ConfigEnum.HY.getSercet()));//默认值
			ac.setAgentId(PropKit.get(ConfigEnum.HY.getAgentId()));
			break;
		case "BX":
			ac.setCorpSecret(PropKit.get(ConfigEnum.BX.getSercet()));//默认值
			ac.setAgentId(PropKit.get(ConfigEnum.BX.getAgentId()));
			break;
		default:
			break;
		}
		/**
		 *  是否对消息进行加密，对应于微信平台的消息加解密方式：
		 *  1：true进行加密且必须配置 encodingAesKey
		 *  2：false采用明文模式，同时也支持混合模式
		 *  
		 *  目前企业号只支持加密且必须配置
		 */
		ac.setEncryptMessage(PropKit.getBoolean("encryptMessage", true));
		ac.setEncodingAesKey(PropKit.get("encodingAesKey", "setting it in config file"));
		return ac;
	}
	
    
    /**
     * 配置常量
     */
	public void configConstant(Constants me) {
		// 加载少量必要配置，随后可用PropKit.get(...)获取值
		logger.info("配置常量开始..");
		loadProp("a_little_config_pro.txt", "a_little_config.txt");
		me.setDevMode(PropKit.getBoolean("devMode", false));
		me.setEncoding("utf-8");
		me.setViewType(ViewType.JSP);
		// ApiConfigKit 设为开发模式可以在开发阶段输出请求交互的 xml 与 json 数据
		ApiConfigKit.setDevMode(me.getDevMode());
		logger.info("配置常量结束..");
	}

	/**
	 * 配置路由
	 */
	public void configRoute(Routes me) {
		//herf-->  1.jsp
		me.add("/", HomeIndexController.class,"meet");//初始化的时候进去的页面
		me.add("/meet", MeetController.class,"meet");
		me.add("/repair", BxController.class,"repair");
		// 2.下面的模块只做基路径的映射
		// 第三个参数为该Controller的视图存放路径//,"mview"		
		me.add("/qymsg", QyWeixinMsgController.class);
		me.add("/qyapi", QyWeixinApiController.class);
		me.add("/qyjssdk", QyJssdkController.class,"jsp");
		me.add("/qyoauth2", QyOAuthController.class);
	}

	private DruidPlugin createDruidPluginMysql() {
		// TODO Auto-generated method stub
		return new DruidPlugin(PropKit.get("jdbcUrlMysql"), 
				PropKit.get("userMysql"), 
				PropKit.get("passwordMysql").trim(),
				PropKit.get("driverClassNameMysql"));
	}
	
    /**
     * 配置插件
     */
    public void configPlugin(Plugins me)
    {
		DruidPlugin druidPlugin = new DruidPlugin(PropKit.get("jdbcUrl"),PropKit.get("user"),PropKit.get("password"),PropKit.get("driverClassName"));		
		me.add(druidPlugin);
		// 配置ActiveRecord插件
		ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);	
		arp.addMapping("jb_room","xh",JbRoom.class);
		arp.addMapping("jb_phone","id",JbPhone.class);
		arp.addMapping("jb_device","id",JbDevice.class);		
		arp.addMapping("mms_create","xh",MeetCreate.class);
		arp.addMapping("mms_ryxx", "xh", Users.class);  //在此定义表和模型之间的关系
		arp.addMapping("bx_create", "id", BxCreate.class);  //在此定义表和模型之间的关系
		arp.addMapping("bx_img_create", "id", BxImgCreate.class);  //在此定义表和模型之间的关系
		arp.addMapping("bx_device", "id", BxDevice.class);  //在此定义表和模型之间的关系
		arp.addMapping("co_meet_order",CoMeetOrder.class);	
		me.add(arp);
    }

	/**
     * 配置全局拦截器
     */
    public void configInterceptor(Interceptors me)
    {
        logger.info("配置全局拦截器开始..");
//        me.addGlobalActionInterceptor(new PhoneInterceptor());
//        me.addGlobalActionInterceptor(new LogInterceptor());
        me.add(new TxByMethodRegex("(.*save.*|.*update.*|.*delete.*)"));// 2.2改动
        logger.info("配置全局拦截器结束..");
    }

    /**
     * 配置处理器
     */
    public void configHandler(Handlers me)
    {
        logger.info("配置处理器开始..");
        me.add(new ContextPathHandler("base"));
        DruidStatViewHandler dsvh = new DruidStatViewHandler("/druid");
        me.add(dsvh);
        logger.info("配置处理器结束..");
    }
//After Jfinal之后加入
    @Override
    public void afterJFinalStart()
    {
        logger.info("afterJFinalStart开始..");
		//单个应用可以直接在启动之后添加
        //如何挂载对应的Config??
		ApiConfigKit.putApiConfig(getApiConfigEnum("HY"));
		ApiConfigKit.putApiConfig(getApiConfigEnum("BX"));
        // 公告		
        logger.info("afterJFinalStart结束..");
    }

    @Override
    public void beforeJFinalStop()
    {
        //beforeJFinalStop();
        logger.info("beforeJFinalStop结束");
    }

    public static void main(String[] args)
    {
        JFinal.start("WebRoot", 80, "/LovePandaJ", 5);
    }

	@Override
	public void configEngine(Engine me) {
		// TODO Auto-generated method stub
		
	}
}
